﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace PcArduinoControl
{
	class CommandConfigPins :
		Command
	{
		static byte[] CompressPinTypes(PinType[] bits)
		{
			PinType[] bitsGood = new PinType[14];

			bits.CopyTo(bitsGood, 0);

			// Replace the "Unconfigured" (0x2) "PinTypes" with "Input" (0x0).
			for (int index = 0; index < bitsGood.Length; index++)
			{
				if (bitsGood[index] == PinType.Unconfigured)
					bitsGood[index] = PinType.Input;
			}

			byte[] bytes = new byte[2];
			bytes[0] += (byte)((byte)bitsGood[0] << 7);
			bytes[0] += (byte)((byte)bitsGood[1] << 6);
			bytes[0] += (byte)((byte)bitsGood[2] << 5);
			bytes[0] += (byte)((byte)bitsGood[3] << 4);
			bytes[0] += (byte)((byte)bitsGood[4] << 3);
			bytes[0] += (byte)((byte)bitsGood[5] << 2);
			bytes[0] += (byte)((byte)bitsGood[6] << 1);
			bytes[0] += (byte)((byte)bitsGood[7] << 0);
			bytes[1] += (byte)((byte)bitsGood[8] << 7);
			bytes[1] += (byte)((byte)bitsGood[9] << 6);
			bytes[1] += (byte)((byte)bitsGood[10] << 5);
			bytes[1] += (byte)((byte)bitsGood[11] << 4);
			bytes[1] += (byte)((byte)bitsGood[12] << 3);
			bytes[1] += (byte)((byte)bitsGood[13] << 2);
			//bytes[1] += (byte)((byte)bits[14] << 1);
			//bytes[1] += (byte)((byte)bits[15] << 0);
			return bytes;
		}

		public CommandConfigPins(params PinType[] pinTypes) :
			base(CommandType.ConfigPins, CompressPinTypes(pinTypes))
		{ }

		protected CommandConfigPins(params byte[] args) :
			base(CommandType.ConfigPins, args)
		{ }
	}
}
